/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trabalhopmforçadesenha;

import java.util.Arrays;

/**
 *
 * @author Gustavo-Note
 */
public class Metodo1 extends Metodo{
    
    private final int PONTOS_PARA_TAMANHO_MENOR_QUE_5 = 3;
    private final int PONTOS_PARA_TAMANHO_ENTRE_5_e_7 = 6;
    private final int PONTOS_PARA_TAMANHO_ENTRE_8_e_15 = 12;
    private final int PONTOS_PARA_TAMANHO_MAIOR_QUE_15 = 18;
    
    private final int PONTOS_POR_AO_MENOS_1_MINUSCULA = 1;
    private final int PONTOS_POR_AO_MENOS_1_MAIUSCULA = 5;
    private final int PONTOS_POR_AO_MENOS_1_NUMERO = 5;
    private final int PONTOS_POR_AO_MENOS_1_SIMBOLO = 5;
    private final int PONTOS_POR_AO_MENOS_1_MAISCULA_E_1_MINUSCULA = 2;
    private final int PONTOS_POR_AO_MENOS_1_LETRA_E_1_NUMERO = 2;
    private final int PONTOS_POR_AO_MENOS_1_LETRA_OU_1_NUMERO_E_UM_SIMBOLO = 2;
    
    private final int PONTOS_POR_3_OU_MAIS_NUMEROS = 5;
    private final int PONTOS_POR_2_OU_MAIS_SIMBOLOS = 5;
      
    public Metodo1(String senha){
        super(senha);
        MAXIMO_PONTOS_PARA_SENHA_MUITO_FRACA = 15;
        MAXIMO_PONTOS_PARA_SENHA_FRACA = 24;
        MAXIMO_PONTOS_PARA_SENHA_MEDIA = 34;
        MAXIMO_PONTOS_PARA_SENHA_FORTE = 44;
    }
    
    
    @Override
    public ForcaSenha checarForcaSenha(){
        
        int pontos = 0;
        
        pontos += obterPontosPorTamanho();
        pontos += checarSeTemMinuscula();
        pontos += checarSeTemMaiuscula();
        pontos += obterPontosPorNumero();
        pontos += obterPontosPorSimbolo();
        pontos += checarSeTemMaiusculaMinuscula();
        pontos += checarSeTemLetraNumero();
        pontos += checarSeTemLetraOuNumeroSimbolo();
        
        this.forca = new ForcaSenha(pontos,super.obterValorForcaSenha(pontos));
        
        return this.forca;
    }
    
    private boolean isMaiuscula(char letra){
        return Character.isLetter(letra) && Character.isUpperCase(letra);
    }
    
    private boolean isMinuscula(char letra){
        return Character.isLetter(letra) && Character.isLowerCase(letra);
    }
    
    private boolean isSimbolo(char letra){
        return !Character.isDigit(letra) && !Character.isLetter(letra);
    }
    
    
    private int obterPontosPorTamanho(){
       int pontos = 0;
       
       if(this.senha.length() < 5) {
            pontos += this.PONTOS_PARA_TAMANHO_MENOR_QUE_5;
        }
       else if(this.senha.length() >= 5 && this.senha.length() <8) {
            pontos += this.PONTOS_PARA_TAMANHO_ENTRE_5_e_7;
        }
       else if(this.senha.length() >= 8 && this.senha.length() < 16) {
            pontos += this.PONTOS_PARA_TAMANHO_ENTRE_8_e_15;
        }
       else {
            pontos += this.PONTOS_PARA_TAMANHO_MAIOR_QUE_15;
        }
       
       return pontos;
    }
    
    private int checarSeTemMinuscula(){
        for(int i = 0; i < this.senha.length(); i++){
            if(isMinuscula(this.senha.charAt(i))) {
                return this.PONTOS_POR_AO_MENOS_1_MINUSCULA;
            }
        }
        return 0;
    }
    
    private int checarSeTemMaiuscula(){
        for(int i = 0; i < this.senha.length(); i++){
            if(isMaiuscula(this.senha.charAt(i))) {
                return this.PONTOS_POR_AO_MENOS_1_MAIUSCULA;
            }
        }
        return 0;
    }
    
    private int obterPontosPorNumero(){
        int numeros = 0;
        for(int i = 0; i < this.senha.length(); i++){
            if(Character.isDigit(this.senha.charAt(i))) {
                numeros++;
            }
        }
        if(numeros == 1) {
            return this.PONTOS_POR_AO_MENOS_1_NUMERO;
        }
        else if(numeros >= 3) {
            return this.PONTOS_POR_AO_MENOS_1_NUMERO + this.PONTOS_POR_3_OU_MAIS_NUMEROS;
        }
        else {
            return 0;
        }
    }
    
    private int obterPontosPorSimbolo(){
        int numSimbolos = 0;
        for(int i = 0; i < this.senha.length(); i++){
            if(isSimbolo(this.senha.charAt(i))) {
                numSimbolos++;
            }
        }
        if(numSimbolos == 1) {
            return this.PONTOS_POR_AO_MENOS_1_SIMBOLO;
        }
        else if(numSimbolos >= 2) {
            return this.PONTOS_POR_AO_MENOS_1_SIMBOLO + 
                    this.PONTOS_POR_2_OU_MAIS_SIMBOLOS;
        }
        else {
            return 0;
        }
    }
    
    private int checarSeTemMaiusculaMinuscula(){
        
        if(checarSeTemMaiuscula() == this.PONTOS_POR_AO_MENOS_1_MAIUSCULA &&
                checarSeTemMinuscula() == this.PONTOS_POR_AO_MENOS_1_MINUSCULA){
            return this.PONTOS_POR_AO_MENOS_1_MAISCULA_E_1_MINUSCULA;
        }
        else{
            return 0;
        }
    }
    
    private int checarSeTemLetraNumero(){
        if((checarSeTemMaiuscula() == this.PONTOS_POR_AO_MENOS_1_MAIUSCULA ||
                checarSeTemMinuscula() == this.PONTOS_POR_AO_MENOS_1_MINUSCULA) &&
                obterPontosPorNumero() >= this.PONTOS_POR_AO_MENOS_1_NUMERO){
            return this.PONTOS_POR_AO_MENOS_1_LETRA_E_1_NUMERO;
        }
        else{
            return 0;
        }
    }
    
    private int checarSeTemLetraOuNumeroSimbolo(){
        if((checarSeTemMaiuscula() == this.PONTOS_POR_AO_MENOS_1_MAIUSCULA ||
                checarSeTemMinuscula() == this.PONTOS_POR_AO_MENOS_1_MINUSCULA ||
                obterPontosPorNumero() >= this.PONTOS_POR_AO_MENOS_1_NUMERO) &&
                obterPontosPorSimbolo() >= this.PONTOS_POR_AO_MENOS_1_SIMBOLO){
            return this.PONTOS_POR_AO_MENOS_1_LETRA_OU_1_NUMERO_E_UM_SIMBOLO;
        }
        else{
            return 0;
        }
    }
    
    
}
